#pragma once

#include <functional>
#include <map>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
#include <any>
#include <mutex>

// 事件基类
class Event {
public:
    virtual ~Event() = default;
    virtual std::string getType() const = 0;
};

// 事件监听器接口
using EventListener = std::function<void(const std::shared_ptr<Event>&)>;

// 事件分发器类
class EventDispatcher {
public:
    EventDispatcher() = default;
    ~EventDispatcher() = default;

    // 添加事件监听器
    void addEventListener(const std::string& eventType, EventListener listener);
    
    // 移除事件监听器
    void removeEventListener(const std::string& eventType);
    
    // 分发事件
    void dispatchEvent(const std::shared_ptr<Event>& event);
    
    // 检查是否有特定类型的事件监听器
    bool hasEventListener(const std::string& eventType) const;
    
private:
    std::unordered_map<std::string, std::vector<EventListener>> listeners;
    std::mutex mutex;
};

// 事件管理器类 (单例模式)
class NoticeCenter {
public:
    static NoticeCenter& getInstance();
    
    // 禁止拷贝和移动
    NoticeCenter(const NoticeCenter&) = delete;
    NoticeCenter& operator=(const NoticeCenter&) = delete;
    NoticeCenter(NoticeCenter&&) = delete;
    NoticeCenter& operator=(NoticeCenter&&) = delete;
    
    // 添加事件监听器
    void addListener(const std::string& eventType, EventListener listener);
    
    // 移除事件监听器
    void removeListener(const std::string& eventType);
    
    // 发布事件
    void postEvent(const std::shared_ptr<Event>& event);
    
    // 创建并发布事件的便捷方法
    template<typename T, typename... Args>
    void postEvent(Args&&... args) {
        auto event = std::make_shared<T>(std::forward<Args>(args)...);
        postEvent(event);
    }
    
private:
    NoticeCenter() = default;
    ~NoticeCenter() = default;
    
    EventDispatcher dispatcher;
};